package com.aliwo.design.patterns.singleton;

/**
 * @author xuyayuan
 * @description 懒加载单例模式
 *  第一次使用到的时候才进行的加载，需要考虑并发问题和指令重排序问题
 * @date 2021/8/26 11:26
 */
public class LazySingleton {
    private volatile static LazySingleton instance;
    private LazySingleton() { }

    /**
     * 功能描述: 双重检测锁模式, synchronized 保证原子性，可见性 volatile 保证可见性，禁止指令重排序
     * @author xuyayuan
     * @param
     * @return com.aliwo.design.patterns.singleton.LazySingleton
     */
    public static LazySingleton getInstance() {
        if (null == instance) {
            synchronized (LazySingleton.class) {
                if (null == instance) {
                    // new LazySingleton(),该步骤不是原子性的分为三个步骤，使用 volatile保证了指令不会重排序的问题
                    // 一：分配内存
                    // 二：调用构造函数初始化实例
                    // 三：让instance指向分配的内存空间
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }

}
